export default class RecordVideo {
	video: HTMLVideoElement;
	mediaRecorder: MediaRecorder | null;
	chunks: BlobPart[];
	/**
	 * 构造函数
	 *
	 * @param  {Object}   videoObj 视频对象
	 */
	constructor(videoObj: HTMLVideoElement) {
		this.video = videoObj;
		this.mediaRecorder = null;
		this.chunks = [];
	}

	/**
	 * 初始化
	 *
	 * @return {Object} promise
	 */
	init() {
		// 返回Promise对象
		// resolve 正常处理
		// reject 处理异常情况
		return new Promise((resolve: (value?: unknown) => void, reject) => {
			navigator.mediaDevices
				.getUserMedia({
					audio: true,
					video: true
					// video: {
					//     width: this.videoWidth,
					//     height: this.videoHeight
					// }
				})
				// 返回一个媒体内容的流
				.then(stream => {
					// 检测是否支持 srcObject，该属性在新的浏览器支持
					if ('srcObject' in this.video) {
						this.video.srcObject = stream;
					} else {
						// 兼容旧的浏览器
						// this.video.src = window.URL.createObjectURL(stream);
					}

					// 当视频的元数据已经加载时触发
					this.video.addEventListener('loadmetadata', () => {
						this.video.play();
					});
					this.mediaRecorder = new MediaRecorder(stream);
					// TODO
					this.mediaRecorder.addEventListener('dataavailable', (e: Event & { data: BlobPart }) => {
						this.chunks.push(e.data);
					});
					resolve();
				})
				// 异常抓取，包括用于禁用麦克风、摄像头
				.catch(error => {
					reject(error);
				});
		});
	}

	/**
	 * 视频开始录制
	 */
	startRecord() {
		if (this.mediaRecorder?.state === 'inactive') {
			this.mediaRecorder.start();
		}
	}

	/**
	 * 视频结束录制
	 */
	stopRecord() {
		if (this.mediaRecorder?.state === 'recording') {
			this.mediaRecorder.stop();
		}
	}

	/**
	 * 检测当前浏览器对否支持
	 *
	 * @return {boolean} 当前浏览器是否支持
	 */
	async isSupport() {
		// TODO
		const flag = navigator.mediaDevices && navigator.mediaDevices.getUserMedia;
		if (await flag()) {
			return true;
		}
	}
}
